
public class XYZT {

	private M matrice;
	private V vecteur;

	/* constructeurs*/

	public XYZT()
	{
		this.matrice = new M();
		this.vecteur = new V();
	}

	/*accesseur*/

	public M getMatrice() {
		return matrice;
	}

	public void setMatrice(M matrice) {
		this.matrice = matrice;
	}

	public V getVecteur() {
		return vecteur;
	}

	public void setVecteur(V vecteur) {
		this.vecteur = vecteur;
	}

	/*fonction*/

	public M extraire(M faits,Integer i)
	{
		M ms = new M(i);
		M tmp = new M();

		JMM jmm = new JMM(faits,1,ms,0);
		tmp = jmm.get();
		tmp.suprC(tmp.size()-1);
		return tmp;
	}


	public M extraireCondition(M regle,Integer numReg)
	{
		M extrait = new M(regle);
		if(extrait.size()>0)
			for(int i = 0; i < extrait.getvecC(0).size();i++)
				if( (extrait.getvecL(i).get(0) != numReg)|| (extrait.getvecL(i).get(1) != D.getInstance().code("IF")) )
				{
					extrait.suprL(i);
					i--;
				}
		//supression de la colonne numero regle
		extrait.suprC(0);
		//supression de la colonne IF /THEM
		extrait.suprC(0);
		return extrait;

	}
	
	public M extraireConclusion(M regle,Integer numReg)
	{
		M extrait = new M(regle);
		if(extrait.size()>0)
			for(int i = 0; i < extrait.getvecC(0).size();i++)
				if( (extrait.getvecL(i).get(0) != numReg)|| (extrait.getvecL(i).get(1) != D.getInstance().code("THEN")) )
				{
					extrait.suprL(i);
					i--;
				}
		
		//supression de la colonne numero regle
		extrait.suprC(0);
		//supression de la colonne IF /THEM
		extrait.suprC(0);
		return extrait;

	}

	/*		on lui donne un vecteur de regle de type : 	?X verbe ?Y
	 * 
	 *		et une matrice de fait  de type : 		   	?X verbe ?Y
	 *													?X verbe ?Y
	 *													?X verbe ?Y
	 */
	public void condition(M extrait,V regle)
	{
		if(this.matrice.size() == 0)
		{
			this.vecteur.ajout_integer(regle.get(0));
			this.vecteur.ajout_integer(regle.get(2));

			this.matrice.add_Vect_C(extrait.getvecC(0));
			this.matrice.add_Vect_C(extrait.getvecC(1));
			this.matrice.size();
		}
		else
		{
			M tmp = new M();
			Integer vj  = VariableExistante(regle.get(0),regle.get(2));
			if(vj == -1)
			{
				for(int i = 0;i < this.matrice.sizeC();i++)
					for(int j = 0; j< extrait.sizeC();j++)
						if( (this.matrice.getvecL(i).get(this.vecteur.getVecteur().indexOf(regle.get(0)))
								== extrait.getvecL(j).get(0))
							&&(this.matrice.getvecL(i).get(this.vecteur.getVecteur().indexOf(regle.get(2)))
								== extrait.getvecL(j).get(1)))
						{
							tmp.add_Vect_L(this.matrice.getvecL(i));
						}
				this.matrice = tmp;
			}
			else
			{
				JMM jmm = new JMM(this.matrice,vj,extrait,regle.getVecteur().indexOf(this.vecteur.get(vj)));
				matrice = jmm.get();
			}
		}
	}

	/*
	 * 		on lui donne un vecteur de regle de type : 	?X verbe ?Y
	 * 
	 * 		on retourn une matrice de type 			 :	?X verbe ?Y
	 *													?X verbe ?Y
	 *													?X verbe ?Y
	 */
	public M conclusion(V regle)
	{
		M tmp = new M();
		if(this.matrice.size()>0)
		{
			tmp.add_Vect_C(this.matrice.getvecC(this.vecteur.getVecteur().indexOf(regle.get(0))));
	
			V tmpv = new V();
			for(int i = 0; i < this.vecteur.size();i++)
				tmpv.ajout_integer(regle.get(1));
	
			tmp.add_Vect_C(tmpv);
			tmp.add_Vect_C(this.matrice.getvecC(this.vecteur.getVecteur().indexOf(regle.get(2))));
		}

		return tmp;
	}

	/* fonction outil */

	/* Calcule la variable existante dans vecteur et retourne son indexe*/
	public Integer VariableExistante(Integer a,Integer b)
	{
		if( (this.vecteur.membre(a)==1) && (this.vecteur.membre(b) == 1) )
			return -1;
		if(this.vecteur.membre(a) == 1)
		{
			//this.vecteur.ajout_integer(a);
			this.vecteur.ajout_integer(b);
			return this.vecteur.getVecteur().indexOf(a);
		}
		else 
		{
			this.vecteur.ajout_integer(a);
			//this.vecteur.ajout_integer(b);
			return this.vecteur.getVecteur().indexOf(b);
		}
	}
	
	public void Clear()
	{
		this.matrice.clear();
		this.vecteur.clear();
	}
}
